<?php
namespace app\index\controller;

use app\common\controller\IndexBaseController;

/**
 * 支付接口
 * @author Kaisa
 * @version 2017-02-09 17:00:00
 */
class PaymentController extends IndexBaseController {

	/**
	 * 支付宝手机支付
	 * $params
	 */
	public function alipay($params = '') {
		if (request()->isPost()) {
			import("payment.alipay.AlipayCore");
			import("payment.alipay.AlipayMd5");
			import("payment.alipay.AlipaySubmit");
			// 获取缓存配置
			$payment_config = get_config('payment_config');
			//合作身份者ID，签约账号，以2088开头由16位纯数字组成的字符串，查看地址：https://b.alipay.com/order/pidAndKey.htm
			$alipay_config['partner'] = $payment_config['alipay_partner'];
			//收款支付宝账号，以2088开头由16位纯数字组成的字符串，一般情况下收款账号就是签约账号
			$alipay_config['seller_id'] = $payment_config['alipay_seller_id'];
			// MD5密钥，安全检验码，由数字和字母组成的32位字符串，查看地址：https://b.alipay.com/order/pidAndKey.htm
			$alipay_config['key'] = $payment_config['alipay_key'];
			// 服务器异步通知页面路径  需http://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问
			$alipay_config['notify_url'] = url("pay/aliapy_notify");
			// 页面跳转同步通知页面路径 需http://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问
			$alipay_config['return_url'] = url("pay/aliapy_return");
			$alipay_config['sign_type'] = strtoupper('MD5');
			$alipay_config['input_charset'] = strtolower('utf-8');
			//ca证书路径地址，用于curl中ssl校验, 请保证cacert.pem文件在当前文件夹目录中
			$alipay_config['cacert'] = getcwd() . '\extend\alipay\cacert.pem';
			$alipay_config['transport'] = 'http';
			$alipay_config['payment_type'] = "1";
			$alipay_config['service'] = "alipay.wap.create.direct.pay.by.user";

			/**************************请求参数**************************/
			//商户订单号，商户网站订单系统中唯一订单号，必填
			$out_trade_no = $_POST['WIDout_trade_no'];
			//订单名称，必填
			$subject = $_POST['WIDsubject'];
			//付款金额，必填
			$total_fee = $_POST['WIDtotal_fee'];
			//收银台页面上，商品展示的超链接，必填
			$show_url = $_POST['WIDshow_url'];
			//商品描述，可空
			$body = $_POST['WIDbody'];
			/************************************************************/
			//构造要请求的参数数组，无需改动
			$parameter = array(
				"service" => $alipay_config['service'],
				"partner" => $alipay_config['partner'],
				"seller_id" => $alipay_config['seller_id'],
				"payment_type" => $alipay_config['payment_type'],
				"notify_url" => $alipay_config['notify_url'],
				"return_url" => $alipay_config['return_url'],
				"_input_charset" => trim(strtolower($alipay_config['input_charset'])),
				"out_trade_no" => $out_trade_no,
				"subject" => $subject,
				"total_fee" => $total_fee,
				"show_url" => $show_url,
				//"app_pay" 		 => "Y", //启用此参数能唤起钱包APP支付宝
				"body" => $body,
			);
			//建立请求
			$alipaySubmit = new \AlipaySubmit($alipay_config);
			$html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
			echo $html_text;
		} else {
			return $this->fetch();
		}
	}

	public function alipay_noify() {
		import("payment.alipay.AlipayCore");
		import("payment.alipay.AlipayMd5");
		import("payment.alipay.AlipayNotify");
		// 获取缓存配置
		$payment_config = get_config('payment_config');
		$alipay_config['partner'] = $payment_config['alipay_partner'];
		$alipay_config['key'] = $payment_config['alipay_key'];
		$alipay_config['sign_type'] = strtoupper('MD5');
		$alipay_config['cacert'] = getcwd() . '\extend\alipay\cacert.pem';
		$alipay_config['transport'] = 'http';
		//计算得出通知验证结果
		$alipayNotify = new \AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyNotify();
		if ($verify_result) {
			//验证成功
			//请在这里加上商户的业务逻辑程序代
			//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			//商户订单号
			$out_trade_no = $_POST['out_trade_no'];
			//支付宝交易号
			$trade_no = $_POST['trade_no'];
			//交易状态
			$trade_status = $_POST['trade_status'];

			if ($_POST['trade_status'] == 'TRADE_FINISHED') {
				//判断该笔订单是否在商户网站中已经做过处理
			} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
			}
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
			echo "success";
			//请不要修改或删除
		} else {
			//验证失败
			echo "fail";
		}
	}

	public function alipay_return() {
		import("payment.alipay.AlipayCore");
		import("payment.alipay.AlipayMd5");
		import("payment.alipay.AlipayNotify");
		// 获取缓存配置
		$payment_config = get_config('payment_config');
		$alipay_config['partner'] = $payment_config['alipay_partner'];
		$alipay_config['key'] = $payment_config['alipay_key'];
		$alipay_config['sign_type'] = strtoupper('MD5');
		$alipay_config['cacert'] = getcwd() . '\extend\alipay\cacert.pem';
		$alipay_config['transport'] = 'http';
		$alipayNotify = new \AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyReturn();
		if ($verify_result) {//验证成功
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			//商户订单号
			$out_trade_no = $_GET['out_trade_no'];
			//支付宝交易号
			$trade_no = $_GET['trade_no'];
			//交易状态
			$trade_status = $_GET['trade_status'];
			if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理
			} else {
				echo "trade_status=" . $_GET['trade_status'];
			}
			echo "验证成功<br />";
			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
		} else {
			//验证失败
			echo "验证失败";
		}
	}

	/**
	 * Post方法
	 * $body     商品描述
	 * $attach   附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用。
	 * $order_no 订单号
	 * $total_fee 价格
	 */
	public function wechat() {
		header('Access-Control-Allow-Origin:*');
		if (request()->isAjax()) {
			import("payment.wxpay.WxPayApi");
			import("payment.wxpay.JsApiPay");
			//①、获取用户openid
			$tools = new \JsApiPay();
			//$openId = $tools->GetOpenid();
			//②、统一下单
			$input = new \WxPayUnifiedOrder();
			// 商品描述
			$input->SetBody('测试');
			// 商品补充说明
			$input->SetAttach('测试');
			// 商户订单号32位以下
			$input->SetOut_trade_no('20150826123456');
			// 价格，单位分
			$input->SetTotal_fee(100);
			$input->SetTime_start(date("YmdHis"));
			$input->SetTime_expire(date("YmdHis", time() + 600));
			// 回调通知处理
			$input->SetNotify_url(url('index/payment/wechat_notify'));
			$input->SetTrade_type("JSAPI");
			$input->SetOpenid("otx0ewIY-HKwa5p0gql3bDfp562A");
			var_dump($input);
		
			$order = \WxPayApi::unifiedOrder($input);
			$jsApiParameters = $tools->GetJsApiParameters($order);
			echo $jsApiParameters;
			exit;
		} else {
			return $this->fetch();
		}
	}

	public function wechat_notify() {
		import("payment.wxpay.notify");
		$notify = new \PayNotifyCallBack();
		$notify->Handle(false);
		
	}

}
